/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.context.annotation;

import java.util.Set;

import org.springframework.beans.factory.Aware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 该接口可由 {@link ImportSelector} 和 {@link ImportBeanDefinitionRegistrar} 的实现类实现，
 * 用于在能够提前确定导入内容时使用。{@link ImportSelector} 和 {@link ImportBeanDefinitionRegistrar}
 * 接口具有较高的灵活性，这使得难以准确判断它们将添加哪些 Bean 定义。
 * 当实现类在相同的源下始终产生相同的导入时，应使用此接口。
 * <p>
 * 使用 {@link DeterminableImports} 对于 Spring 的测试支持尤其有用，
 * 它可以更好地生成 {@link ApplicationContext} 缓存键。
 *
 * @author Phillip Webb
 * @author Andy Wilkinson
 * @since 1.5.0
 */
@FunctionalInterface
public interface DeterminableImports {

	/**
	 * 返回一组表示导入内容的对象。返回的 {@code Set} 中的对象必须实现有效的
	 * {@link Object#hashCode()} 和 {@link Object#equals(Object)} 方法。
	 * <p>
	 * 来自多个 {@link DeterminableImports} 实例的导入可以由调用者合并，以创建完整的导入集合。
	 * <p>
	 * 与 {@link ImportSelector} 和 {@link ImportBeanDefinitionRegistrar} 不同，
	 * 在调用此方法之前，不会调用任何 {@link Aware} 回调。
	 * @param metadata 来源的注解元数据
	 * @return 表示实际驱动导入的注解的键集合
	 */
	Set<Object> determineImports(AnnotationMetadata metadata);

}
